home *** CD-ROM | disk | FTP | other *** search
- //-------------------------------------------------------
- // NotepadCloneWithPrinting.cs ⌐ 2001 by Charles Petzold
- //-------------------------------------------------------
- using System;
- using System.Drawing;
- using System.Drawing.Printing;
- using System.IO;
- using System.Windows.Forms;
-
- class NotepadCloneWithPrinting: NotepadCloneWithFormat
- {
- PrintDocument prndoc = new PrintDocument();
- PageSetupDialog setdlg = new PageSetupDialog();
- PrintPreviewDialog predlg = new PrintPreviewDialog();
- PrintDialog prndlg = new PrintDialog();
- string strPrintText;
- int iStartPage, iNumPages, iPageNumber;
-
- public new static void Main()
- {
- System.Threading.Thread.CurrentThread.ApartmentState =
- System.Threading.ApartmentState.STA;
-
- Application.Run(new NotepadCloneWithPrinting());
- }
- public NotepadCloneWithPrinting()
- {
- strProgName = "Clon del Bloc de notas con impresi≤n";
- MakeCaption();
-
- prndoc.PrintPage += new PrintPageEventHandler(OnPrintPage);
- setdlg.Document = prndoc;
- predlg.Document = prndoc;
- prndlg.Document = prndoc;
-
- prndlg.AllowSomePages = true;
- prndlg.PrinterSettings.FromPage = 1;
- prndlg.PrinterSettings.ToPage =
- prndlg.PrinterSettings.MaximumPage;
- }
- protected override void MenuFileSetupOnClick(object obj, EventArgs ea)
- {
- setdlg.ShowDialog();
- }
- protected override void MenuFilePreviewOnClick(object obj, EventArgs ea)
- {
- prndoc.DocumentName = Text; // Para el caso de que se imprima.
-
- strPrintText = txtbox.Text;
- iStartPage = 1;
- iNumPages = prndlg.PrinterSettings.MaximumPage;
- iPageNumber = 1;
-
- predlg.ShowDialog();
- }
- protected override void MenuFilePrintOnClick(object obj, EventArgs ea)
- {
- prndlg.AllowSelection = txtbox.SelectionLength > 0;
-
- if (prndlg.ShowDialog() == DialogResult.OK)
- {
- prndoc.DocumentName = Text;
-
- // Inicializar algunos campos importantes.
-
- switch (prndlg.PrinterSettings.PrintRange)
- {
- case PrintRange.AllPages:
- strPrintText = txtbox.Text;
- iStartPage = 1;
- iNumPages = prndlg.PrinterSettings.MaximumPage;
- break;
-
- case PrintRange.Selection:
- strPrintText = txtbox.SelectedText;
- iStartPage = 1;
- iNumPages = prndlg.PrinterSettings.MaximumPage;
- break;
-
- case PrintRange.SomePages:
- strPrintText = txtbox.Text;
- iStartPage = prndlg.PrinterSettings.FromPage;
- iNumPages = prndlg.PrinterSettings.ToPage -
- iStartPage + 1;
- break;
- }
- // Y comenzar a imprimir.
-
- iPageNumber = 1;
- prndoc.Print();
- }
- }
- void OnPrintPage(object obj, PrintPageEventArgs ppea)
- {
- Graphics grfx = ppea.Graphics;
- Font font = txtbox.Font;
- float cyFont = font.GetHeight(grfx);
- StringFormat strfmt = new StringFormat();
- RectangleF rectfFull, rectfText;
- int iChars, iLines;
-
- // Calcular RectangleF para el encabezado y el pie.
-
- if (grfx.VisibleClipBounds.X < 0) // Presentaci≤n preliminar
- rectfFull = ppea.MarginBounds;
- else // Impresi≤n normal
- rectfFull = new RectangleF(
- ppea.MarginBounds.Left - (ppea.PageBounds.Width -
- grfx.VisibleClipBounds.Width) / 2,
- ppea.MarginBounds.Top - (ppea.PageBounds.Height -
- grfx.VisibleClipBounds.Height) / 2,
- ppea.MarginBounds.Width, ppea.MarginBounds.Height);
-
- // Calcular RectangleF para el texto.
-
- rectfText = RectangleF.Inflate(rectfFull, 0, -2 * cyFont);
-
- int iDisplayLines = (int) Math.Floor(rectfText.Height / cyFont);
- rectfText.Height = iDisplayLines * cyFont;
-
- // Preparar el objeto StringFormat para mostrar el texto en un rectßngulo.
-
- if (txtbox.WordWrap)
- {
- strfmt.Trimming = StringTrimming.Word;
- }
- else
- {
- strfmt.Trimming = StringTrimming.EllipsisCharacter;
- strfmt.FormatFlags |= StringFormatFlags.NoWrap;
- }
- // Para "algunas pßginas", obtener la primera pßgina.
-
- while ((iPageNumber < iStartPage) && (strPrintText.Length > 0))
- {
- if (txtbox.WordWrap)
- grfx.MeasureString(strPrintText, font, rectfText.Size,
- strfmt, out iChars, out iLines);
- else
- iChars = CharsInLines(strPrintText, iDisplayLines);
-
- strPrintText = strPrintText.Substring(iChars);
- iPageNumber++;
- }
- // Si falta texto prematuramente, cancelar el trabajo de impresi≤n.
-
- if (strPrintText.Length == 0)
- {
- ppea.Cancel = true;
- return;
- }
- // Mostrar el texto de la pßgina.
-
- grfx.DrawString(strPrintText, font, Brushes.Black,
- rectfText, strfmt);
-
- // Obtener el texto de la pßgina siguiente.
-
- if (txtbox.WordWrap)
- grfx.MeasureString(strPrintText, font, rectfText.Size,
- strfmt, out iChars, out iLines);
- else
- iChars = CharsInLines(strPrintText, iDisplayLines);
-
- strPrintText = strPrintText.Substring(iChars);
-
- // Restablecer StringFormat para el encabezado y el pie de pßgina.
-
- strfmt = new StringFormat();
-
- // Mostrar el nombre del archivo en la parte superior.
-
- strfmt.Alignment = StringAlignment.Center;
- grfx.DrawString(FileTitle(), font, Brushes.Black,
- rectfFull, strfmt);
-
- // Mostrar el n·mero de pßgina en la parte inferior.
-
- strfmt.LineAlignment = StringAlignment.Far;
- grfx.DrawString("Pagina " + iPageNumber, font, Brushes.Black,
- rectfFull, strfmt);
-
- // Decidir si se imprime otra pßgina.
-
- iPageNumber++;
- ppea.HasMorePages = (strPrintText.Length > 0) &&
- (iPageNumber < iStartPage + iNumPages);
-
- // Reinicializar variables para imprimir desde la presentaci≤n preliminar.
-
- if (!ppea.HasMorePages)
- {
- strPrintText = txtbox.Text;
- iStartPage = 1;
- iNumPages = prndlg.PrinterSettings.MaximumPage;
- iPageNumber = 1;
- }
- }
- int CharsInLines(string strPrintText, int iNumLines)
- {
- int index = 0;
-
- for (int i = 0; i < iNumLines; i++)
- {
- index = 1 + strPrintText.IndexOf('\n', index);
-
- if (index == 0)
- return strPrintText.Length;
- }
- return index;
- }
- }